#!/bin/bash

# =============================================
# abctl 一键安装脚本
# 适用于 Linux 和 WSL/WSL2 (仅限 amd64 架构)
# =============================================

# 在任何命令失败时立即退出
set -e

# --- 用户可配置变量 ---
# 设置文件下载地址
# 如果留空，脚本将自动从 GitHub 获取最新版本。
# 您可以提供一个直接的 .tar.gz 文件下载链接。
# 例如: DOWNLOAD_URL="https://github.com/airbytehq/abctl/releases/download/v0.2.0/abctl-0.2.0-linux-amd64.tar.gz"
DOWNLOAD_URL=${DOWNLOAD_URL:-""}

# 安装目录
DIR_INSTALL="/usr/local/bin"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# --- 核心功能函数 ---

# 检查命令是否存在
command_exists() {
    command -v "$1" >/dev/null 2>&1
}

# 使用 sudo 或直接执行
run_with_sudo() {
    if [ "$(id -u)" -eq 0 ]; then
        "$@"
    elif command_exists sudo; then
        sudo -E "$@"
    else
        log_error "此脚本需要 root 权限。请以 root 用户运行或确保 sudo 可用。"
        exit 1
    fi
}

# 检查系统环境
check_environment() {
    log_info "检查系统环境..."
    
    # 检查操作系统
    if [ "$(uname)" != "Linux" ]; then
        log_error "此脚本专为 Linux/WSL 环境设计。检测到的系统: $(uname)"
        exit 1
    fi

    # 检查系统架构
    local arch=$(uname -m)
    if [ "$arch" != "x86_64" ]; then
        log_error "此脚本仅支持 amd64 (x86_64) 架构。检测到的架构: $arch"
        exit 1
    fi

    # 检查下载工具
    if ! command_exists curl && ! command_exists wget; then
        log_error "未找到 curl 或 wget。请安装其中一个以继续。"
        exit 1
    fi
    
    # 检查网络连接
    log_info "检查网络连接..."
    if command_exists curl; then
        if ! curl -fsSL --connect-timeout 10 --max-time 30 "https://api.github.com" >/dev/null 2>&1; then
            log_error "无法连接到 GitHub API。请检查网络连接。"
            exit 1
        fi
    elif command_exists wget; then
        if ! wget -q --timeout=10 --tries=1 "https://api.github.com" -O /dev/null 2>/dev/null; then
            log_error "无法连接到 GitHub API。请检查网络连接。"
            exit 1
        fi
    fi
    
    # 检查安装目录权限
    if [ ! -d "$DIR_INSTALL" ]; then
        log_info "创建安装目录: $DIR_INSTALL"
        run_with_sudo mkdir -p "$DIR_INSTALL"
    fi
    
    if [ ! -w "$DIR_INSTALL" ] && [ "$(id -u)" -ne 0 ]; then
        log_warning "安装目录 $DIR_INSTALL 不可写，将使用 sudo 权限安装。"
    fi
    
    log_success "系统环境检查通过。"
}

# 检查是否已安装
check_existing_installation() {
    if command_exists abctl; then
        log_warning "abctl 已安装在: $(command -v abctl)"
        read -p "是否要覆盖现有安装? [y/N] " response
        if [[ ! "$response" =~ ^[yY]([eE][sS])?$ ]]; then
            log_info "用户取消操作。"
            exit 0
        fi
        log_info "将继续覆盖安装..."
    fi
}

# 下载文件
download_file() {
    local url="$1"
    local output="$2"
    
    if command_exists curl; then
        if ! curl -fsSL "$url" -o "$output"; then
            log_error "下载失败: $url"
            exit 1
        fi
    elif command_exists wget; then
        if ! wget -q "$url" -O "$output"; then
            log_error "下载失败: $url"
            exit 1
        fi
    fi
}

# 安装 abctl 二进制文件
install_abctl() {
    local url="$1"
    local temp_dir
    temp_dir=$(mktemp -d)
    local archive_file="$temp_dir/abctl.tar.gz"
    
    # 设置清理函数
    cleanup_temp() {
        if [ -n "$temp_dir" ] && [ -d "$temp_dir" ]; then
            rm -rf "$temp_dir"
        fi
    }
    
    # 设置退出时清理
    trap cleanup_temp EXIT

    log_info "正在下载 abctl..."
    if [ -z "$url" ]; then
        log_info "从 GitHub 获取最新版本信息..."
        local release_data
        release_data=$(download_file "https://api.github.com/repos/airbytehq/abctl/releases/latest" "-")
        url=$(echo "$release_data" | grep "browser_download_url.*linux-amd64.tar.gz" | cut -d '"' -f 4)
        if [ -z "$url" ]; then
            log_error "无法在 GitHub 上找到适用于 linux-amd64 的发布版本。"
            exit 1
        fi
    fi
    
    log_info "下载地址: $url"
    download_file "$url" "$archive_file"

    log_info "正在解压并安装..."
    cd "$temp_dir"
    if ! tar -xzf "$archive_file"; then
        log_error "解压归档文件失败。"
        exit 1
    fi
    
    local binary_path
    binary_path=$(find . -type f -name "abctl" | head -n 1)
    if [ -z "$binary_path" ]; then
        log_error "在解压的归档文件中未找到 'abctl' 二进制文件。"
        exit 1
    fi

    log_info "将 '$binary_path' 安装到 ${DIR_INSTALL}"
    chmod +x "$binary_path"
    if ! run_with_sudo cp "$binary_path" "${DIR_INSTALL}/abctl"; then
        log_error "复制二进制文件到安装目录失败。"
        exit 1
    fi
    
    # 手动清理临时目录
    cleanup_temp
    
    log_success "abctl 安装完成。"
}

# 测试安装
test_installation() {
    log_info "验证安装..."
    if abctl --help > /dev/null; then
        log_success "abctl 命令运行正常。"
    else
        log_error "安装失败：'abctl' 命令无法正常运行。"
        exit 1
    fi
}

# 显示安装后信息
show_post_install_info() {
    echo ""
    log_success "abctl 安装成功!"
    echo ""
    log_info "开始使用:"
    echo "   abctl --help"
    echo ""
    log_info "注意: 根据您的 Docker 配置，您可能需要使用 sudo 来运行 abctl。"
}

# --- 主函数 ---
main() {
    log_info "=== abctl 一键安装脚本 ==="
    log_info "开始时间: $(date)"

    check_environment
    check_existing_installation
    install_abctl "$DOWNLOAD_URL"
    test_installation
    show_post_install_info
    
    log_success "脚本执行完成!"
}

# --- 脚本执行入口 ---
main "$@"
